/**
 * #info
 *
 *@author   wuwg
 *@createTime   2018/03/20
 *@updateTime   2018/03/21
 *@description  message  component   全局提示组件
 */

/**
 * #methodcomponent
 *
 * @type        aty-message
 * @cn          全局消息
 * @menu        通知
 */

import config from '../../../config/config.js'

//  components
import Notification from '../../base/notification/index.js'
// prefix
const prefixCls = config.prefix + '-message'
const iconPrefixCls = config.prefix + '-icon'
const prefixKey = config.prefix + '_message_key_'
const defaults = {
  top: 24,
  duration: 1.5
}
let messageInstance
let name = 1
const iconTypes = {
  info: 'information-circled',
  success: 'checkmark-circled',
  warning: 'android-alert',
  error: 'close-circled',
  loading: 'load-c'
}

function getMessageInstance () {
  messageInstance = messageInstance || Notification.newInstance({
    prefixCls: prefixCls,
    styles: {
      top: `${defaults.top}px`
    }
  })

  return messageInstance
}
function notice (
  content = '',
  duration = defaults.duration,
  type,
  onClose = function () {},
  closable = false,
  render = function () {}) {
  const iconType = iconTypes[type]

  // if loading
  const loadCls = type === 'loading' ? ' ' + config.prefix + '-load-loop' : ''

  const instance = getMessageInstance()

  instance.notice({
    name: `${prefixKey}${name}`,
    duration: duration,
    styles: {},
    transitionName: 'move-up',
    content: `<div class="${prefixCls}-custom-content ${prefixCls}-${type}">
                    <i class="${iconPrefixCls} ${iconPrefixCls}-${iconType}${loadCls}"></i>
                    <span>${content}</span>
                </div> `,
    render: render,
    onClose: onClose,
    closable: closable,
    type: 'message'
  })

  // 用于手动消除
  return (function () {
    const target = name++

    return function () {
      instance.remove(`${prefixKey}${target}`)
    }
  })()
}
// module
const module = {
  name: config.prefix + '-message',

  info (options) {
    return this.message('info', options)
  },
  success (options) {
    return this.message('success', options)
  },
  warning (options) {
    return this.message('warning', options)
  },
  error (options) {
    return this.message('error', options)
  },
  loading (options) {
    return this.message('loading', options)
  },
  message (type, options) {
    if (typeof options === 'string') {
      options = {
        content: options
      }
    }
    return notice(options.content, options.duration, type, options.onClose, options.closable, options.render)
  },
  config (options) {
    if (options.top || options.top === 0) {
      defaults.top = options.top
    }
    if (options.duration || options.duration === 0) {
      defaults.duration = options.duration
    }
  },
  destroy () {
    const instance = getMessageInstance()
    messageInstance = null
    instance.destroy(config.prefix + '-message')
  }
}
export default module
